網站的使用者會分很多種角色
以電商網站的例子來說,可能會分成
網站管理員
商店老闆
商店員工
一般使用者
VIP
所以我們需要一個欄位來判斷這個使用者是哪個角色
我們可以使用 enum 來快速的完成這個功能
Enum 的全名為 Enumerations,中文為列舉的意思
我們可以將資料分成「列舉」中的分類
藉此來幫助我們做資料上的區別
Enum 除了能幫我們將資料分類起來,
我們還可以透過 Enum 將這個欄位的資料型態存為 Integer
Integer (個位數)相較於 String 所佔的記憶體小
不過撈出資料來的時候會顯示出一個 String,讓開發者更知道這筆資料是在哪個分類之下
先到 user 的檔案中,加入 enum 設定
在這邊提一下, enum 有兩種寫法
Array 的第一個對應到的 integer 為 0,依此類推
# app/model/user.rb
enum role: [:admin, :owner, :employee, :vip, :user]
Hash 中的第一個對應到的 integer 可以自行設定,沒有設定的話就是 0
# app/model/user.rb
enum role: { admin: 1, owner: 2, employee: 3, vip: 4, user: 5 }
我們可以在 migration 指定預設值給他,
建議是使用這種做法,程式碼改變的時候,也不會影響
要做這個設定的話,我們就先產生一個 migration,並且加上 default 值給他
def change
add_column :users, :role, default: 4
end
之後建立 user ,就會自動給他設定角色為 user
在 Rails 6.1 版本後, enum 可以用 default 來新增預設值囉
只要在後面加上 _default: 加上你要設定的預設角色即可
enum role: [:user, :admin, :owner, :employee, :vip], _default: :user
你以為 enum 就只有這樣嗎?其實他還提供了我們很多便利的方法
如果我們在一個 model 中有許多個 enum 方法,我們可以使用前綴及後綴的方式來避免混淆
方法前面加上欄位名稱當作前綴
# app/model/user.rb
enum role: %i[user admin owner employee vip], _default: :user, _prefix: true
# 在 rails console 中
User.last.role_user? # 回傳 true 或 false
還可以自定義前綴名稱,在 _prefix 後面加上你要換的名稱的 symbol
enum role: %i[user admin owner employee vip], _default: :user, _prefix: :authorize
# 在 rails console 中
User.last.authorize_user? # 回傳 true 或 false
方法後面加上欄位名稱當作後綴
# app/model/user.rb
enum role: %i[user admin owner employee vip], _default: :user, _suffix: true
# 在 rails console 中
User.last.user_role? # 回傳 true 或 false
還可以自定義後綴名稱,在 _prefix 後面加上你要換的名稱的 symbol
enum role: %i[user admin owner employee vip], _default: :user, _suffix: :authorize
# 在 rails console 中
User.last.user_authorize? # 回傳 true 或 false
在開發的時候,如果想立刻切換角色來看效果的話,這個方法非常實用!
我們只要在角色後面加個驚嘆號
在 rails console
User.last.admin!
如果我想撈出所有角色是老闆的 user,
可以直接下角色的方法
在 rails console
User.owner
假設我今天要判斷這個 user 是不是管理員,
可以直接在角色後面加 ?
# 在 view 裡面
current_user.admin? #回傳 true 或者 false
# 在 rails console 裡面
User.last.admin? #回傳 true 或者 false
用以下方式可以撈出來,並且搭配 options_for_select 等方法,就可以輕鬆做出 enum 的下拉選單
User.roles